package tom.vertx.core.demo14;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Launcher;

/**
 * 虽然vertx可以直接通过java -jar形式运行main方法，但是推荐使用{@link io.vertx.core.Launcher}启动最终运行的{@link io.vertx.core.spi.launcher.DefaultCommand}的实现，
 * 通过Launcher启动可以在命令行使用vertx 命令行参数，如-instances 等，
 * 需要设置manifest的 Main-Class : io.vertx.core.Launcher  Main-Verticle : xxxx
 * 或者直接运行Launcher
 *  java io.vertx.core.Launcher run org.acme.MyVerticle --redeploy="**&#47;*.class"  --launcher-class=io.vertx.core.Launcher -cp ...
 *  默认会通过spi加载默认的commandFactory实现，通过运行command.run方法启动vertx.
 *  如果有必要可以自行继承DefaultCommand实现自己的Command，或自定义实现CommandFactory
 * @author ZHUFEIFEI
 * @see io.vertx.core.spi.launcher.DefaultCommand
 * @see io.vertx.core.spi.launcher.CommandFactoryLookup
 * @see io.vertx.core.spi.launcher.CommandFactory
 */
public class LauncherDemo {

  public static void main(String[] args) {
//    Launcher.main(new String[]{"run", V.class.getName()});
    //等效，main内部调用executeCommand
    Launcher.executeCommand("run", V.class.getName());

    //创建bare类型节点, 在集群ha启用情况下，bare节点不启动任何verticle，当集群中有节点宕机时，bare节点接收并运行宕机的verticle
//    Launcher.executeCommand("bare");
//    Launcher.main(new String[]{"bare"});
  }

  public static class V extends AbstractVerticle {
    @Override
    public void start() throws Exception {
      vertx.setPeriodic(2000L, id -> {
        System.out.println("Hello");
      });
    }
  }

}
